#include "mylabel.h"

mylabel::mylabel(QWidget *parent)
    : QLabel{parent}
{
    //QWidget默认是 不追踪事件
    //设置启动label的追踪事件
    // this->setMouseTracking(true);
    // qDebug()<<"mylabel()";

    //启动定时器
    //参数一：触发器的时间，单位ms
    //第一种写法：多个定时器聚集在同一个函数，要根据对应的定时器id判断
    //id=startTimer(100);

    //第二种写法
    QTimer* qtm=new QTimer(this);//指定父窗口
    qtm->start(100);
    qtm->installEventFilter(this);//用于过滤定时事件
    connect(qtm,&QTimer::timeout,this,[=](){
        static int num=0;
        QString str;
        if(num<100)
        {
            str=QString("正在加载[%1]").arg(++num);
        }
        else if(num==100)
        {
            str=QString("加载完毕[%1]").arg(num);
            qtm->stop();
        }
        setText(str);
    });


}


void mylabel::enterEvent(QEnterEvent* ev)
{
    setText("鼠标已进入");
}
void mylabel::leaveEvent(QEvent *ev)
{
    setText("鼠标已退出");
}

void mylabel::mousePressEvent(QMouseEvent *ev)
{
    //qt中的字符串拼接，可以采用QString()与arg()结合的方式
    // QString str1=QString("%1   %2   %3").arg("位置一").arg("位置二").arg("位置三");
    // qDebug()<<str1;

    //判断是左键还是右键,鼠标中键按下
    QString btn;
    if(ev->button()==Qt::LeftButton)
    {
        btn="左键";
    }
    else if(ev->button()==Qt::RightButton)
    {
        btn="右键";
    }

    else if(ev->button()==Qt::MiddleButton)
    {
        btn="中键";
    }
    QString str2=QString("MousePree[%1]:(%2,%3)").arg(btn).arg(ev->x()).arg(ev->y());
    this->setText(str2);
}

void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{
    //判断是左键还是右键,鼠标中键按下
    QString btn;
    if(ev->button()==Qt::LeftButton)
    {
        btn="左键";
    }
    else if(ev->button()==Qt::RightButton)
    {
        btn="右键";
    }

    else if(ev->button()==Qt::MiddleButton)
    {
        btn="中键";
    }
    QString str2=QString("MousePree[%1]:(%2,%3)").arg(btn).arg(ev->x()).arg(ev->y());
    this->setText(str2);
}

void mylabel::mouseMoveEvent(QMouseEvent *ev)
{
    //鼠标移动
    //button()的使用场景是某一个瞬时状态，比如鼠标的按下/释放的瞬间
    //buttons()的使用场景的 一个持续的时间状态，比如按住了鼠标左键移动
    //判断是左键还是右键,鼠标中键按下移动
    QString btn;
    if(ev->buttons()& Qt::LeftButton)
    {
        btn="左键";
    }
    else if(ev->buttons() & Qt::RightButton)
    {
        btn="右键";
    }

    else if(ev->buttons() & Qt::MiddleButton)
    {
        btn="中键";
    }
    QString str2=QString("MousePree[%1]:(%2,%3)").arg(btn).arg(ev->x()).arg(ev->y());
    this->setText(str2);
}

void mylabel::timerEvent(QTimerEvent *ev)
{
    //判断对应的定时器处理对应的事件
    if(ev->timerId()==id)
    {
        static int num=0;
        QString str;
        if(num<100)
        {
            str=QString("正在加载[%1]").arg(++num);
        }
        else if(num==100)
        {
            str=QString("加载完毕[%1]").arg(num);
                      killTimer(id);//停止定时器
        }
        setText(str);
    }
}

bool mylabel::event(QEvent *ev)
{
    //这种过滤方式可以过滤第一种定时器事件：重写timerEvent
    if(ev->type()==QEvent::Timer)
    {
        /*返回值
         * true --代表事件被处理过了,不再向下分发,停止了.
         * false --事件没有被处理,会继续分发.
        */
        return true;
    }
    return QLabel::event(ev);
}

//想要过滤第二种方式的定时器, 定时器的第二种写法: 类似于实例化一个QTimer的对象采用以下的重写方式
//注意要安装拦截器，比如在定时器中：qtm->installEventFilter(this);
bool mylabel::eventFilter(QObject *obj, QEvent *ev)
{
    if(ev->type()==QEvent::Timer)
    {
        return true;
    }
    return QLabel::eventFilter(obj,ev);
}










